package server;
import common.*;
import java.io.IOException;
import java.util.ArrayList;

/**
 * Classe dedicata alla comunicazione tra interfaccia grafica e logica del server in locale. 
 */
public class Client_locale implements Client, Server{
	private ArrayList<Object> array = new ArrayList<Object>();
	
	private Locale loc;
	
	/**
	 * Costruttore di classe, che permette l'inizializzazione della variabile per avere un riferimento alla classe Locale.
	 * @param local
	 */
	public Client_locale(Locale local){
		this.loc = local;
	}
	
	@Override
	public void creaUtente(String usr, String pass){
		array = loc.getGioco().creaUtente(usr, pass);
		Boolean par = (Boolean)array.get(0);
		if (par==false)
			loc.getC_GSessionegioco().errore(Integer.parseInt(String.valueOf(array.get(1))));
		else loc.getC_GSessionegioco().creaUtente();
	}
	
	@Override
	public void login(String usr, String pass){
		array = loc.getGioco().login(usr, pass);
		Boolean par = (Boolean)array.get(0);
		if (par==false)
			loc.getC_GSessionegioco().errore(Integer.parseInt(String.valueOf(array.get(1))));
		else{
			loc.getC_GSessionegioco().login(Integer.parseInt(String.valueOf(array.get(1))));
		}
	}
	
	@Override
	public void creaRazza(int tok,String nome,String ti){
		String tipo;
		if(ti.equals("C"))
			tipo="c";
		else
			tipo="e";
		array = loc.getGioco().creaRazza(tok, nome, tipo);
		Boolean par = (Boolean)array.get(0);
		if (par==false)
			loc.getC_GSessionegioco().errore(Integer.parseInt(String.valueOf(array.get(1))));
	}
	
	@Override
	public void classifica(int tok){
		array = loc.getGioco().classifica(tok);
		Boolean par = (Boolean)array.get(0);
		if (par==false)
			loc.getC_GSessionegioco().errore(Integer.parseInt(String.valueOf(array.get(1))));
		else{
			String[][] matrix = new String[array.size()-1][4];
			for (int i=0; i<array.size()-1;i++){
				matrix[i][0] = ((String[])(array.get(i+1)))[0];
				matrix[i][1] = ((String[])(array.get(i+1)))[1];
				matrix[i][2] = ((String[])(array.get(i+1)))[2];
				matrix[i][3] = ((String[])(array.get(i+1)))[3];				
			}
			loc.getC_GSessionegioco().classifica(matrix);
		}
	}
	
	@Override
	public void logout(int tok){
		array = loc.getGioco().logout(tok);
		Boolean par = (Boolean)array.get(0);
		if (par==false)
			loc.getC_GSessionegioco().errore(Integer.parseInt(String.valueOf(array.get(1))));
		else{
			loc.getC_GSessionegioco().logout();
		}
	}
	
	/*METODI CHIAMATI IN PARTITA*/
	
	@Override
	public void accessoPartita(int tok){
		array = loc.getPartita().accessoPartita(tok);
		Boolean par = (Boolean)array.get(0);
		if (par==false)
			loc.getC_GSessionegioco().errore(Integer.parseInt(String.valueOf(array.get(1))));
		else{
			loc.getC_GSessionegioco().accessoPartita();
			Boolean cambioT = (Boolean)array.get(1);
			if(cambioT){
				loc.getPartita().cambioTurno();
			}
		}
	}
	
	@Override
	public void uscitaPartita(int tok){
		array = loc.getPartita().uscitaPartita(tok);
		Boolean par = (Boolean)array.get(0);
		if (par==false)
			loc.getC_GSessionegioco().errore(Integer.parseInt(String.valueOf(array.get(1))));
		else{
			loc.getC_GSessionegioco().uscitaPartita();
		}
	}
	
	@Override
	public void listaGiocatori(int tok){
		array=loc.getPartita().listaGiocatori(tok);
		Boolean par = (Boolean)array.get(0);
		if (par==false)
			loc.getC_GSessionegioco().errore(Integer.parseInt(String.valueOf(array.get(1))));
		else{
			loc.getC_GSessionegioco().listaGiocatori((String[])(array.get(1)));
		}
	}
	
	@Override
	public void mappaGenerale(int tok){
		array=loc.getPartita().mappaGenerale(tok);
		Boolean par = (Boolean)array.get(0);
		if (par==false)
			loc.getC_GSessionegioco().errore(Integer.parseInt(String.valueOf(array.get(1))));
		else{
			int righe = (Integer)array.get(1);
			int colonne = (Integer)array.get(2);
			String[][] mappa = (String[][])array.get(3);
			loc.getC_GSessionegioco().mappaGenerale(righe, colonne, mappa);
		}
	}
	
	@Override
	public void listaDinosauri(int tok){
		array = loc.getPartita().listaDinosauri(tok);
		Boolean par = (Boolean)array.get(0);
		if (par==false)
			loc.getC_GSessionegioco().errore(Integer.parseInt(String.valueOf(array.get(1))));
		else{
			array.remove(0);
			String[] arrayiddino= (String[])array.get(0);
				loc.getC_GSessionegioco().listaDinosauri(arrayiddino);
		}
	}
	
	@Override
	public void vistaLocale(int tok, String id){
		array = loc.getPartita().vistaLocale(tok, id);
		Boolean par = (Boolean)array.get(0);
		if (par==false){
			loc.getC_GSessionegioco().errore(Integer.parseInt(String.valueOf(array.get(1))));
		}
		else{
			int x = Integer.parseInt(String.valueOf(array.get(1)));
			int y = Integer.parseInt(String.valueOf(array.get(2)));
			int righe = Integer.parseInt(String.valueOf(array.get(3)));
			int colonne = Integer.parseInt(String.valueOf(array.get(4)));
			String[][] mappina = (String[][])(array.get(5));
			loc.getC_GSessionegioco().vistaLocale(x,y,righe,colonne,mappina);
		}
	}
	
	@Override
	public void statoDinosauro(int tok, String id){
		array=loc.getPartita().statoDinosauro(tok, id);
		Boolean par = (Boolean)array.get(0);
		if (par==false)
			loc.getC_GSessionegioco().errore(Integer.parseInt(String.valueOf(array.get(1))));
		else{
			String userId="";
			String razza="";
			char tipo=' ';
			int posX=-1;
			int posY=-1;
			int dimensione=-1;
			int energia=-1;
			int vita = -1;
			for(int i=1; i<array.size(); i++){
				switch(i-1){
				case 0:
					userId=(String)array.get(i);
					break;
				case 1:
					razza = (String)array.get(i);
					break;
				case 2:
					tipo = (Character)array.get(i);
					break;
				case 3:
					posX = (Integer)array.get(i);
					break;
				case 4:
					posY = (Integer)array.get(i);
					break;
				case 5:
					dimensione = (Integer)array.get(i);
					break;
				case 6:
					energia = (Integer)array.get(i);
					break;
				case 7:
					vita = (Integer)array.get(i);
					break;
				}
			}
			loc.getC_GSessionegioco().statoDinosauro(userId, razza, tipo, posX, posY, dimensione, energia, vita);
		}		
	}
	
	@Override
	public void muoviDinosauro(int tok, String id, int x, int y){
		array=loc.getPartita().muoviDinosauro(tok, id, x, y);
		Boolean par = (Boolean)array.get(0);
		if (par==false)
			loc.getC_GSessionegioco().errore(Integer.parseInt(String.valueOf(array.get(1))));
		else{
			if((Boolean)array.get(1)){
				//combattimento
				if((Integer)array.get(2)==2){
					//ha perso
					loc.getC_GSessionegioco().muoviDinosauro("p");
				}else{
					//ha vinto
					loc.getC_GSessionegioco().muoviDinosauro("");
				}
			}else{
				//si muove e/o mangia
				loc.getC_GSessionegioco().muoviDinosauro("");
			}
		}
	}
	
	@Override
	public void cresciDinosauro(int tok, String id){
		array=loc.getPartita().cresciDinosauro(tok, id);
		Boolean par = (Boolean)array.get(0);
		if (par==false)
			loc.getC_GSessionegioco().errore(Integer.parseInt(String.valueOf(array.get(1))));
		else{
			mappaGenerale(tok);
		}
	}
	
	@Override
	public void deponiUovo(int tok, String id){
		array=loc.getPartita().deponiUovo(tok, id);
		Boolean par = (Boolean)array.get(0);
		if (par==false)
			loc.getC_GSessionegioco().errore(Integer.parseInt(String.valueOf(array.get(1))));
		else{
			mappaGenerale(tok);	
		}
	}
		
	@Override
	public void confermaTurno(int tok){
		array=loc.getPartita().confermaTurno(tok);
		Boolean par = (Boolean)array.get(0);
		if (par==false)
			loc.getC_GSessionegioco().errore(Integer.parseInt(String.valueOf(array.get(1))));
	}
	
	@Override
	public void passaTurno(int tok){
		array = loc.getPartita().passaTurno(tok);
		Boolean par = (Boolean)array.get(0);
		if (par==false)
			loc.getC_GSessionegioco().errore(Integer.parseInt(String.valueOf(array.get(1))));
		else{
			loc.getPartita().cambioTurno();
		}
	}

	@Override
	public void cambioTurno(String username) throws IOException {
		loc.getC_GSessionegioco().cambioTurno(username);
		
	}

	@Override
	public void specieMorta(String username, Boolean bul) throws IOException {
		loc.getC_GSessionegioco().specieMorta(username);
		if(bul){
			loc.getPartita().cambioTurno();
		}
		
	}
	
	/**
	 * Metodo usato per tornare l'oggetto array contenuto in questa classe.
	 * @return L'oggetto ArrayList della classe.
	 */
	public ArrayList<Object> getArray(){
		return array;
	}
	
	/**
	 * Metodo che ritorna l'oggetto locale di cui si ha il riferimento all'interno della classe.
	 * @return L'oggetto locale ricevuto e istanziato nel costruttore.
	 */
	public Locale getLocale(){
		return loc;
	}
}
